package com.acdc.wechat.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.io.InputStream;
import java.security.PrivateKey;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;

/**
 * 微信支付配置检查工具
 * 用于验证微信支付相关的配置文件和证书
 */
public class WechatPayConfigChecker {
    
    private static final Logger log = LoggerFactory.getLogger(WechatPayConfigChecker.class);
    
    /**
     * 检查微信支付配置
     */
    public static void checkConfig() {
        log.info("=== 开始检查微信支付配置 ===");
        
        // 检查商户私钥
        checkPrivateKey();
        
        // 检查微信支付平台证书
        checkWechatPayCertificate();
        
        // 检查配置参数
        checkConfigParameters();
        
        log.info("=== 微信支付配置检查完成 ===");
    }
    
    /**
     * 检查商户私钥
     */
    private static void checkPrivateKey() {
        try {
            log.info("检查商户私钥文件...");
            
            String privateKeyPath = "classpath:cert/apiclient_key.pem";
            if (privateKeyPath.startsWith("classpath:")) {
                String classPath = privateKeyPath.substring("classpath:".length());
                Resource resource = new ClassPathResource(classPath);
                
                if (resource.exists()) {
                    try (InputStream inputStream = resource.getInputStream()) {
                        PrivateKey privateKey = PemUtil.loadPrivateKey(inputStream);
                        log.info("✓ 商户私钥加载成功 - 算法: {}, 格式: {}, 长度: {} 字节", 
                                privateKey.getAlgorithm(), 
                                privateKey.getFormat(), 
                                privateKey.getEncoded().length);
                    }
                } else {
                    log.error("✗ 商户私钥文件不存在: {}", classPath);
                }
            }
        } catch (Exception e) {
            log.error("✗ 商户私钥检查失败", e);
        }
    }
    
    /**
     * 检查微信支付平台证书
     */
    private static void checkWechatPayCertificate() {
        try {
            log.info("检查微信支付平台证书...");
            
            String certPath = "classpath:cert/wechatpay_cert.pem";
            if (certPath.startsWith("classpath:")) {
                String classPath = certPath.substring("classpath:".length());
                Resource resource = new ClassPathResource(classPath);
                
                if (resource.exists()) {
                    try (InputStream inputStream = resource.getInputStream()) {
                        X509Certificate certificate = PemUtil.loadCertificate(inputStream);
                        log.info("✓ 微信支付平台证书加载成功 - 主题: {}, 颁发者: {}, 有效期至: {}", 
                                certificate.getSubjectDN(),
                                certificate.getIssuerDN(),
                                certificate.getNotAfter());
                    }
                } else {
                    log.warn("⚠ 微信支付平台证书文件不存在: {} (这是可选的，但建议配置)", classPath);
                }
            }
        } catch (Exception e) {
            log.error("✗ 微信支付平台证书检查失败", e);
        }
    }
    
    /**
     * 检查配置参数
     */
    private static void checkConfigParameters() {
        log.info("检查配置参数...");
        
        // 这里可以添加更多配置参数的检查
        // 比如检查环境变量、配置文件等
        
        log.info("✓ 配置参数检查完成");
    }
    
    /**
     * 测试解密功能
     */
    public static void testDecryption() {
        log.info("=== 开始测试解密功能 ===");
        
        try {
            // 模拟测试数据
            String testCiphertext = "test_ciphertext";
            String testAssociatedData = "test_associated_data";
            String testNonce = "test_nonce";
            String testApiV3Key = "test_api_v3_key_32_chars_long";
            
            log.info("测试解密参数:");
            log.info("  ciphertext: {}", testCiphertext);
            log.info("  associatedData: {}", testAssociatedData);
            log.info("  nonce: {}", testNonce);
            log.info("  apiV3Key长度: {}", testApiV3Key.length());
            
            // 注意：这里只是测试参数格式，实际解密会失败
            log.info("✓ 解密参数格式检查通过");
            
        } catch (Exception e) {
            log.error("✗ 解密功能测试失败", e);
        }
        
        log.info("=== 解密功能测试完成 ===");
    }
    
    /**
     * 主方法，用于独立测试
     */
    public static void main(String[] args) {
        log.info("微信支付配置检查工具启动");
        
        // 检查配置
        checkConfig();
        
        // 测试解密功能
        testDecryption();
        
        log.info("配置检查工具运行完成");
    }
}
